www.gusucode.com > 串口测试程序,用于调试rs485接口 串口通信的程序 > 串口测试程序,用于调试rs485接口 串口通信的程序/commtest/MeterBase.cpp
// MeterBase.cpp: implementation of the CMeterBase class. // ////////////////////////////////////////////////////////////////////// #include <unistd.h> #include <stdlib.h> #include "MeterBase.h" #include "MPGB.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// /* typedef struct { BYTE status;//电表状态 BYTE property;//电表性质 BYTE addr[6];//电表地址 BYTE protcol;//电表协议 BYTE port;//测量点端口号 BYTE baudrate;//波特率 BYTE bytesize;//数据位长度 BYTE stopbits;//停止位 BYTE parity;//校验和 }METERCOMPARA;//电表通讯参数 //890F typedef struct { METERCOMPARA com_para; BYTE type;//电表接线方式 8910 BYTE No; //电表序号 }METERPARA; */ CMeterBase::CMeterBase() { // printf("\r\nCMeterBase()"); // m_meter_com_para.com_No = 0; // m_meter_com_para.com_bcd.parity = 2; // m_meter_com_para.com_bcd.BaudRate = 4; // m_meter_com_para.com_bcd.ByteSize = 8; // m_meter_com_para.com_bcd.StopBits = 0; } CMeterBase::CMeterBase(METERPARA meter) { // printf("\r\nCMeterBase(METERPARA meter)"); memcpy(&m_meter,&meter,sizeof(METERPARA)); // pMPBase = new CMPGB(); } CMeterBase::~CMeterBase() { delete pMPBase; } bool CMeterBase::AttachCom(MyCom *pCom) { pMyCom = pCom; if(pMyCom == NULL) return false; return true; } bool CMeterBase::AttachShmMan(ShmMan *pShm) { pShmMan = pShm; if(pShmMan == NULL) return false; return true; } bool CMeterBase::OnOpenCom() { pMyCom->Init_Serial( m_meter.com_para );//初始化串口参数失败 if ( !pMyCom->sem_serial_open() ) //打开端口 { #ifdef DBUG_PRO printf("Open COMM%d FALSE!!",m_meter.com_para.port); #endif return false; } usleep(100);//程序挂起,1个MS,用与装缓转换时间 return true; } bool CMeterBase::OnCloseCom() { if(pMyCom == NULL) return false; pMyCom->sem_serial_close(); usleep(10000); return true; } int CMeterBase::Write(BYTE *buff, int Len) { return pMyCom->serial_write(buff,Len); } int CMeterBase::Read(BYTE *buff, int Len) { return pMyCom->serial_read(buff,Len);//int SerialCom::serial_read(unsigned char * buf, int len) } bool CMeterBase::WaitForReponse(int t) { return pMyCom->wait_for_response( t ); } bool CMeterBase::GetData(BYTE *data,int &dataLen,int item) { int FrmLen,RecvLen; BYTE tmp_buf[256]; BYTE buff[64]; FrmLen = pMPBase->FormReadDataFrame(buff, item, m_meter.com_para.addr); if(FrmLen == 0) { #ifdef DBUG_PRO printf("\r\n组织命令数据失败!!!!"); #endif return false; } int j,i; for(i = 0; i < 2; i ++) { if( !OnOpenCom() ) { continue;//串行口打开失败 } Write(buff,FrmLen); //发送帧 if ( !WaitForReponse(TIME_SEC) ) //等待回应帧 { OnCloseCom(); continue; } RecvLen = Read(tmp_buf,sizeof(tmp_buf) ); //读取帧 OnCloseCom(); dataLen = 0; j = pMPBase->ProcReturnedFrame(tmp_buf,RecvLen,item,data,dataLen,m_meter.com_para.addr); printf("\r\nDATALEN %d j = %d",dataLen,j); if ( j == 0 || j == 0x0600 )//解析帧 { return true; } } return false; } bool CMeterBase::SetAddress(BYTE *address,int &Len) { int FrmLen,RecvLen; BYTE tmp_buf[256]; BYTE buff[64]; Len = 0; FrmLen = pMPBase->FormSetAddress(buff, m_meter.com_para.addr); if(FrmLen == 0) { #ifdef DBUG_PRO printf("\r\n组织命令数据失败!!!!"); #endif return false; } int j,i; for(i = 0; i < 2; i ++) { if( !OnOpenCom() ) { continue;//串行口打开失败 } Write(buff,FrmLen); //发送帧 if ( !WaitForReponse(TIME_SEC) ) //等待回应帧 { OnCloseCom(); continue; } RecvLen = Read(tmp_buf,sizeof(tmp_buf) ); //读取帧 OnCloseCom(); j = pMPBase->ProcReturnedFrame(tmp_buf,RecvLen,0xC032,address,Len,m_meter.com_para.addr); if ( j == 0 )//解析帧 { return true; } } return false; } bool CMeterBase::SetClock(time_t *m_time)//无数据响应 { int FrmLen; // BYTE tmp_buf[256]; BYTE buff[64]; FrmLen = pMPBase->FormCheckClock(buff, m_time);//(BYTE *buff,time_t *m_time = NULL) = 0 if(FrmLen == 0) { #ifdef DBUG_PRO printf("\r\n组织命令数据失败!!!!"); #endif return false; } if( !OnOpenCom() ) { return false;//continue;//串行口打开失败 } Write(buff,FrmLen); //发送帧 OnCloseCom(); return true; } bool CMeterBase::SetShmStatus(BYTE m_status) { pShmMan->SetStatus( m_status,m_meter.No ); return true; } #ifdef DBUG_PRO bool CMeterBase::Display() { printf("\r\n METER NO = %d;",m_meter.No); printf("\r\n METER TYPE = %d;",m_meter.type); printf("\r\n METER STATUS = %d;",m_meter.com_para.status); printf("\r\n METER property = %d;",m_meter.com_para.property); printf("\r\n METER addr = %02x%02x%02x%02x%02x%02x;", m_meter.com_para.addr[0],m_meter.com_para.addr[1],m_meter.com_para.addr[2], m_meter.com_para.addr[3],m_meter.com_para.addr[4],m_meter.com_para.addr[5] ); printf("\r\n METER protcol = %d;",m_meter.com_para.protcol); printf("\r\n METER port = %d;",m_meter.com_para.port); printf("\r\n METER baudrate = %d;",m_meter.com_para.baudrate); printf("\r\n METER bytesize = %d;",m_meter.com_para.bytesize); printf("\r\n METER stopbits = %d;",m_meter.com_para.stopbits); printf("\r\n METER parity = %d;",m_meter.com_para.parity); return true; } #endif